package fr.noe.amicaleloisirs.concours.client;

//import static com.google.gwt.query.client.GQuery.$;
//import static gwtquery.plugins.draggable.client.Draggable.Draggable;
//import static gwtquery.plugins.droppable.client.Droppable.Droppable;

import java.util.List;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;

import fr.noe.amicaleloisirs.concours.business.Concours;
import fr.noe.amicaleloisirs.concours.business.Player;
import fr.noe.amicaleloisirs.concours.business.Team;
import fr.noe.amicaleloisirs.concours.interfaces.CallbackCreationPlayer;
import fr.noe.amicaleloisirs.concours.interfaces.CallbackHandler;
import fr.noe.amicaleloisirs.concours.utils.Constants;
import fr.noe.amicaleloisirs.concours.utils.Constants.Tour;
import fr.noe.amicaleloisirs.concours.utils.FileSystem;
import fr.noe.amicaleloisirs.concours.utils.Logger;
import fr.noe.amicaleloisirs.concours.utils.XMLHelper;
import fr.noe.amicaleloisirs.concours.view.ClassementView;
import fr.noe.amicaleloisirs.concours.view.ConfirmPopUp;
import fr.noe.amicaleloisirs.concours.view.CreatePlayerView;
import fr.noe.amicaleloisirs.concours.view.EquipesPanel;
import fr.noe.amicaleloisirs.concours.view.InfoPopUp;
import fr.noe.amicaleloisirs.concours.view.ListeJoueursPanel;
import fr.noe.amicaleloisirs.concours.view.MatchsPanel;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 * 
 * @author Sébastien PREVOST
 */
public class Belote implements EntryPoint {

	final Button ajouterJoueur = new Button("Ajouter");
	final ListeJoueursPanel listeJoueursPanel = new ListeJoueursPanel();

	final HorizontalPanel conteneur = new HorizontalPanel();

	private static Belote instance = null;

	private Concours concours;

	private void init() {

		// read the player file to populate the helper
		String xmlPlayers = FileSystem.get().read(
				Constants.PLAYER_LIST_FILE_URL);
		// init helper
		XMLHelper.get().setListeJoueurs(xmlPlayers);

		// set Browser in fullscreen
		Window.moveTo(0, 0);
		Window.resizeTo(Constants.getScreenWidth(), Constants.getScreenHeight());

		// créer / charger le concours
		concours = Concours.get();
	}

	public static Belote get() {
		return instance;
	}
	
	private static void log(String text) {
		Logger.get().logWithClass("Belote", text);
	}

	/**
	 * This is the entry point method.
	 */
	public void onModuleLoad() {
		instance = this;
		init();

		conteneur.setHeight("100%");
		conteneur.setWidth("100%");
		conteneur.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		
		if (concours.getTour() == Tour.INIT) {
			onInitTour();
		} 
		else if (concours.getTour() == Tour.UN) {
			onFirstTour();
		}
		else if (concours.getTour() == Tour.QUATRE && concours.checkAllTeamsHaveNbTour(4)) {
			displayClassement();
		} 
		else {
			displayMatchPanel();
		}
		RootPanel.get().add(conteneur);
	}

	private void onInitTour() {
		conteneur.clear();
		
		final List<Player> players = XMLHelper.get().getPlayerList();
		listeJoueursPanel.addPlayers(players);

		VerticalPanel vPanel = new VerticalPanel();
		vPanel.setStyleName("joueur-panel");
		vPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		vPanel.add(listeJoueursPanel);

		vPanel.add(ajouterJoueur);

		ajouterJoueur.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				CallbackCreationPlayer callback = new CallbackCreationPlayer() {
					@Override
					public void onValidate(final String nom, final String prenom) {
						new ConfirmPopUp("Création du joueur " + prenom + " "
								+ nom + " ?", new CallbackHandler() {
							@Override
							public void onValidate() {
								Player created = XMLHelper.get().createPlayer(
										nom, prenom);
								players.add(created);
								listeJoueursPanel.addPlayer(created);
							}

							@Override
							public void onCancel() {
							}
						});
					}

					@Override
					public void onCancel(String nom, String prenom) {
					}
				};

				new CreatePlayerView("Ajouter un nouveau joueur", null,
						callback);
			}
		});

		conteneur.add(vPanel);
		conteneur.add(new EquipesPanel(listeJoueursPanel));
		
	}

	public void startConcours(List<Team> teams) {
		log("startConcours avec " + teams.size() + " équipes");
		for (Team t : teams) {
			concours.addTeam(t);
		}
		if (concours.nextTour()) {
			onFirstTour();
		} else {
			new InfoPopUp(
					"Une erreur est survenue, impossible de démarrer le concours",
					new ClickHandler() {

						@Override
						public void onClick(ClickEvent event) {
						}
					});
		}
	}

	public void onFirstTour() {
		log("onFirstTour()");
		displayMatchPanel();
	}

	private void displayMatchPanel() {
		log("Affichage du matchPanel");
		conteneur.clear();
		conteneur.add(new MatchsPanel(concours));

		// une fois le match panel affiché, faire un auto save.
		Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {

			@Override
			public void execute() {
				concours.sauverConcours();
			}
		});
	}

	public void displayClassement() {
		log("Affichage du classement");
		conteneur.clear();

		VerticalPanel vPanel = new VerticalPanel();
		vPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		vPanel.add(new ClassementView(concours.getClassement()));

		if (concours.getTour() != Tour.QUATRE) {
			final Button next = new Button("Partie suivante");
			next.addStyleName("withMargin");
			vPanel.add(next);

			// une fois affiché le classement, on lance le tirage des parties
			// pour ne pas le faire sur le click (temps perdu)
			Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {

				@Override
				public void execute() {
					boolean ok = concours.nextTour();
					log("Tirage au sort du prochain tour : " + ok);
					next.addClickHandler(new ClickHandler() {

						@Override
						public void onClick(ClickEvent event) {
							displayMatchPanel();
						}
					});
				}

			});
		}
		
		// fin du concours
		else {
			concours.sauverConcours();
		}
		conteneur.add(vPanel);
	}
   
  /**
	 * Affiche la liste des joueurs pour les ajouter à un concours déjà commencé.
	 */
	public void showPlayerListToAddTeamAfterBeginning() {

		// creation du DIV contenant la liste des joueurs (taille : 1px x 1 px)
		final Element div = DOM.createDiv();

		div.setClassName("playerDiv onePixelDiv");

	//	div.insertFirst(saveConteneur.getElement());

		conteneur.getElement().appendChild(div);

		Timer t = new Timer() {

			@Override
			public void run() {
				BodyElement body = Document.get().getBody();
				body.addClassName("grey");
				div.removeClassName("onePixelDiv");
			}

		};

		t.schedule(600);
	}

	public void closePlayerListToAddTeamAfterBeginning(final Element div) {
		div.setClassName("playerDiv onePixelDiv");

		Timer t = new Timer() {

			@Override
			public void run() {
				BodyElement body = Document.get().getBody();
				body.removeClassName("grey");

				div.getStyle().setDisplay(Display.NONE);
				conteneur.getElement().removeChild(div);
			}

		};

		t.schedule(600);
	}
}
